"""
详细解释 char_index[char] = right 的作用
"""


def explain_char_index():
    s = "abcabc"
    print("=" * 80)
    print(f"字符串: '{s}'")
    print("=" * 80)
    print("\n我们要解决的问题：")
    print("当遇到重复字符时，如何知道它上一次出现在哪里？\n")

    char_index = {}  # 字符 -> 最后出现的位置
    left = 0

    for right, char in enumerate(s):
        print(f"\n{'─'*80}")
        print(f"步骤 {right}: 遍历到字符 '{char}' (索引 {right})")
        print(f"{'─'*80}")

        # 显示当前字符串和指针位置
        print("\n字符串:  ", end="")
        for i, c in enumerate(s):
            if i == right:
                print(f"[{c}]", end=" ")  # 当前字符
            else:
                print(f" {c} ", end=" ")
        print()

        print("索引:    ", end="")
        for i in range(len(s)):
            print(f" {i}  ", end="")
        print()

        print("窗口:    ", end="")
        for i in range(len(s)):
            if i == left:
                print(" L  ", end="")  # Left
            elif i == right:
                print(" R  ", end="")  # Right
            elif left < i < right:
                print(" │  ", end="")  # 窗口内
            else:
                print("    ", end="")
        print(f"  (窗口范围: [{left}, {right}])")

        # 核心逻辑：检查字符是否重复
        print(f"\n🔍 检查: 字符 '{char}' 是否在当前窗口内重复？")

        if char in char_index:
            old_pos = char_index[char]
            print(f"   ✓ 字符 '{char}' 之前出现过，上次在索引 {old_pos}")

            # 关键判断：上次出现的位置是否在当前窗口内？
            if old_pos >= left:
                print(f"   ⚠️  索引 {old_pos} >= 窗口左边界 {left}")
                print(f"   → 这个字符在【当前窗口内】重复了！")
                print(f"   → 需要移动左边界 left: {left} → {old_pos + 1}")
                left = old_pos + 1
            else:
                print(f"   ✓ 索引 {old_pos} < 窗口左边界 {left}")
                print(f"   → 这个字符虽然出现过，但【不在当前窗口内】")
                print(f"   → 不需要移动左边界")
        else:
            print(f"   ✓ 字符 '{char}' 是第一次出现")

        # 重点：无论如何都要更新字符的位置！
        print(f"\n📝 更新字典: char_index['{char}'] = {right}")
        char_index[char] = right

        print(f"\n当前字典内容: {char_index}")
        print(f"当前窗口: '{s[left:right+1]}' (长度 {right - left + 1})")

        input("\n按 Enter 继续...")

    print("\n" + "=" * 80)
    print("总结：char_index 的作用")
    print("=" * 80)
    print("1. 记录每个字符最后一次出现的索引位置")
    print("2. 用于快速判断字符是否在当前窗口内重复")
    print("3. 帮助我们知道应该把左边界移动到哪里")
    print("=" * 80)


if __name__ == "__main__":
    explain_char_index()
